#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <stdbool.h>
//int lengthOfLongestSubstring(char* s) 
//{	
//	assert(s);
//	int max = 0;
//	int tmp = 0;
//	
//	while (*s != '\0')
//	{
//		int i = 0;
//		tmp = 0;
//		while (s[i] != '\0')
//		{
//			if (NULL != memchr(s, s[i], i))
//				break;
//			else
//				tmp++;
//			i++;
//		}
//		if (tmp > max)
//			max = tmp;
//		s++;
//	}
//	return max;
//}

int lengthOfLongestSubstring(char* s)
{
	if (s == NULL)
		return 0;
	int chr[128] = { 0 };
	int left = 0;
	int right = 0;
	int max = 0;
	while (s[right] != '\0')
	{
		if (chr[s[right]] == 0)
		{
			chr[s[right]]++;
			right++;
		}
		else
		{
			while (s[left] != s[right])
			{
				chr[s[left]]--;
				left++;
			}
			left++;
			right++;
		}
		if (right - left > max)
			max = right - left;
	}
	return max;
}

//void Reverse(char* tmp,int n)
//{
//	assert(tmp);
//	int left = 0;
//	int right = n;
//	while (left < n)
//	{
//		char x = tmp[left];
//		tmp[left++] = tmp[right];
//		tmp[right--] = x;
//	}
//}
//
//bool checkInclusion(char* s1, char* s2) 
//{
//	assert(s1 && s2);
//	int len = strlen(s1) - 1;
//	int slen = len;
//	int left = 0;
//	int right = 0;
//	char* tmp = (char*)calloc((size_t)len + 2, sizeof(char));
//	assert(tmp);
//	while (len--)
//		right++;
//	while (s2[right] != '\0')
//	{
//		if ((s2[left] == s1[0] && s2[right] == s1[slen])||(s2[left] == s1[slen] && s2[right] == s1[0]))
//		{
//			memmove(tmp, s2 + left, sizeof(char) * (slen + 1));
//			if (strcmp(s1, tmp) == 0)
//				return true;
//			Reverse(tmp,slen);
//			if (strcmp(s1, tmp) == 0)
//				return true;
//		}
//		right++;
//		left++;
//	}
//	return false;
//}


bool ChrEmpty(int* chr)
{
	for (int x = 0; x < 26; x++)
		if (chr[x] != 0)
			return false;
	return true;
}

bool checkInclusion(char* s1, char* s2)
{
	assert(s1 && s2);
	int slen = strlen(s1) - 1;
	if (slen + 1 > strlen(s2))
		return false;
	int left = 0;
	int right = 0;

	int chr[26] = { 0 };
	int x = 0;
	while (s1[x] != '\0')
		chr[s1[x++]]++;
	while (slen--)
	{
		chr[s2[right]]--;
		right++;
	}
	chr[s2[right]]--;

	while (s2[right] != '\0')
	{
		if (ChrEmpty(chr))
			return true;
		chr[s2[left]]++;
		left++;
		right++;
		chr[s2[right]]--;
	}
	return false;
}


int main()
{
	// char* x = "abcabcbb";
	// printf("%d", lengthOfLongestSubstring(x));
	char* x1 = "ab";
	char* x2 = "eidboaoo";
	if (checkInclusion(x1, x2))
		printf("haha");
	else
		printf("NO");
	return 0;
}